package study.算法Algorithm.常用10种算法.分治算法;

/*
    分治算法介绍
        1、分治算法是一种重要的算法。字面上的解释就是分而治之，就是把一个复杂的问题分成两个或更多的相同或相似的子问题，
        再将子问题分解成更小的子问题，直到最后的子问题可以简单的直接求解，原问题的解即子问题的解的合并。这个技巧是
        很多高效算法的基础，如排序算法中的快速排序、归并排序，傅里叶变换 等等

        难点： 如何将一个复杂问题分解成众多的相同的小问题，然后将小问题的解合并
        基本步骤：
        分治法再每一层递归上都有三个步骤：
            1、分解：将原问题分解为若干个规模较小的，相互独立，与原问题形式相同的子问题
            2、解决：若子问题规模较小而容易被解决则直接解决，否则递归地解各个子问题
            3、合并：将各个子问题的解合并为原问题的解
 */
public class HanoiTower {

    public static void main(String[] args) {
        hanoiTower(4 ,'A','B','C');
    }

    //汉诺塔的移动方法
    /**
     *   演示汉诺塔的移动方式
     * @param num  盘子的个数
     * @param a   起点塔
     * @param b   中间借助的塔
     * @param c   重点塔
     */
    public static void hanoiTower(int num, char a, char b, char c) {
        //如果只有一个盘
        if (num == 1) {
            System.out.println("第1个盘从 " + a + "->" + c);
        } else {
            //如果 n>+2 有多个盘的情况。  需要把整体看作是两个盘  1、最下面的盘 2、上面的盘
            //1、先把最上面的盘 从A->B   移动过程会使用到c
            hanoiTower(num - 1, a, c, b);
            //2、把最下面的盘 从A->C
            System.out.println("第" + num + "个盘从 " + a + "->" + c);
            //3、把 B塔所有盘 移动到C   移动过程使用到a
            hanoiTower(num-1,b,a,c);
        }
    }
}
